﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FONCREAGROINTEGRAL.Models;
using Microsoft.Reporting.WebForms;

namespace FONCREAGROINTEGRAL.Controllers
{
    public class rentaquintaController : Controller
    {
        public SistIntFoncreagroEntities entidades = new SistIntFoncreagroEntities();
        //
        // GET: /rentaquinta/

        public ActionResult Index(int id)
        {
            int start = Convert.ToInt32(Request.QueryString["start"]);
            int limit = Convert.ToInt32(Request.QueryString["limit"]);

            string area = Convert.ToString(Request.QueryString["query"]);

            var query = entidades.RENTAQUINTAs
                .Join(entidades.EJERCICIOMES
                , fs => fs.idejerciciomes, cp => cp.idejerciciomes, (fs, cp) => new
                {
                    fs.idrentaquinta,
                    fs.sueldo,
                    fs.tipo,
                    fs.Devuelto,
                    fs.retenciones,
                    cp.BONIFI35,
                    fs.pagada,
                    cp.mes,
                    cp.IdEjercicio,
                    fs.idejerciciomes,
                    cp,
                    fs.IdPersonal,
                    fs.Grati,                    

                }).Join(entidades.EJERCICIOs
                , fs => fs.cp.IdEjercicio, p => p.IdEjercicio, (fs, p) => new
                {
                    fs.idrentaquinta,
                    fs.sueldo,
                    fs.tipo,
                    fs.Devuelto,
                    fs.retenciones,
                    fs.pagada,
                    fs.mes,
                    fs.IdEjercicio,
                    fs.idejerciciomes,
                    fs.IdPersonal,
                    p.Anio,
                    fs.BONIFI35,
                    fs.Grati,
      
                })
                .Where(a => a.IdPersonal == id).OrderByDescending(a=>a.Anio);
            /*if (!String.IsNullOrEmpty(area))
            {
                query = query.Where(a => (a.Nombre).ToUpper().Contains(area.ToUpper()));
            }*/
            var result = (from a in query.OrderByDescending(a => a.Anio).Skip(start).Take(limit).ToList()
                          
                          //join rq in entidades.RENTAQUINTAs on em.idejerciciomes equals rq.idejerciciomes
                          select new
                          {
                              Id = a.idrentaquinta,
                              Sueldo = a.sueldo,//(a.sueldo == null ? 0 : a.sueldo) + (a.dh == null ? 0 : a.dh),
                              Ejerciciomes = a.mes,
                              Ejercicio = a.IdEjercicio,
                              Anio = a.Anio,
                              Gratificacion = a.mes == 7 ? a.Grati /*Gratificacion(Convert.ToInt32(a.IdPersonal), 0, 6) */: a.mes == 12 ? a.Grati /* Gratificacion(Convert.ToInt32(a.IdPersonal), 6, 12)*/ : 0, 
                              Tipo = a.tipo,
                              Retencion = (a.retenciones == null ? 0 : a.retenciones),// + IngresosRentaQuinta(Convert.ToInt32(a.IdPersonal), Convert.ToInt32(em.mes), 2),
                              //Devuelto = (a.Devuelto==false?"Falso":"Verdadero"),
                              Estadoretencion = a.pagada,
                              Devuelto = a.Devuelto,
                          }).ToList();

            return Json(new { grid = result, total = query.Count() }, JsonRequestBehavior.AllowGet);
        }

        //Calculo gratificaciones
        public decimal Gratificacion(int id, int inferior, int superior)//int periodo validar el tema del periodo
        {
            var query = entidades.RENTAQUINTAs.Join(entidades.EJERCICIOMES, rq => rq.idejerciciomes, em => em.idejerciciomes, (rq, em) => new {rq.IdPersonal,rq.tipo,em.mes,rq.sueldo,rq.dh })
                .Where(rq => rq.IdPersonal == id && rq.tipo == 1 && rq.mes>inferior && rq.mes <= superior);
            var monto = query.Sum(rq => (rq.sueldo == null ? 0 : rq.sueldo) + (rq.dh == null ? 0 : rq.dh));
            return decimal.Round(Convert.ToDecimal((monto/6)),2);
        }
        //Certificado Renta de Quinta
        public decimal IngresosRentaQuinta(int id,int mes,int tipo)//int periodo validar el tema del periodo
        {

            try
            {
                var query = entidades.CERTIFICADORQs//.Join(entidades.EJERCICIOMES, rq => rq.idejerciciomes, em => em.idejerciciomes, (rq, em) => new { rq.IdPersonal, rq.tipo, em.mes, rq.sueldo })
                    .Single(crq => crq.IdPersonal == id && crq.estado == true);
                //var monto = query.ingresos;

                DateTime mesfin = new DateTime();
                mesfin = DateTime.Parse(query.fechafin.ToString());

                if (mesfin.Month == mes)
                {
                    if (tipo == 1)
                        return decimal.Round(Convert.ToDecimal((query.ingresos)), 2);
                    else
                        return decimal.Round(Convert.ToDecimal((query.rqpagadas)), 2);
                }
                else
                    return 0;
            }
            catch
            {
                return 0;
            }
        }

        //id ***-idpersonal
        //
        // GET: /rentaquinta/Details/5

        public ActionResult AfectoRentaQuinta(int id)
        {
            try{
                
                var ejerm = entidades.EJERCICIOMES.Single(ejm => ejm.vigente == true);
                int idejerciciomes = Convert.ToInt32(ejerm.idejerciciomes);
                entidades.REstaRentaQuinta(idejerciciomes, id, 1);
                return Content("OK");
            }
            catch {
                return Content("Parametros Incorrectos");
            }
        }
        //
        // GET: /rentaquinta/Details/5

        public ActionResult SinRentaQuinta(int id)
        {
            try
            {
                var ejerm = entidades.EJERCICIOMES.Single(ejm => ejm.vigente == true);
                int idejerciciomes = Convert.ToInt32(ejerm.idejerciciomes);
                entidades.REstaRentaQuinta(idejerciciomes, id, 0);
                return Content("OK");
            }
            catch
            {
                return Content("Parametros Incorrectos");
            }
        }
        //
        // GET: /rentaquinta/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /rentaquinta/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /rentaquinta/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        
        //
        // GET: /rentaquinta/Edit/5
 
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: /rentaquinta/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //Ingreso Manual de Retencion
        [HttpPost]
        public ActionResult Manual(int id, FormCollection collection)
        {
            var mrentaquinta = entidades.RENTAQUINTAs.Single(rq => rq.idrentaquinta == id);
            bool Dev = Convert.ToBoolean(Request.Params["Devuelto"]);
            decimal ret = Convert.ToDecimal(Request.Params["retenciones"]);
            var Sueldo = Request.Params["Sueldo"];
            var Gratificacion =Request.Params["Gratificacion"];
            var BonifiExtr = Request.Params["BonifiExtr"];
            try
            {
                // TODO: Add update logic here
                mrentaquinta.calculado = false;
                mrentaquinta.Devuelto = Dev;
                mrentaquinta.retenciones = ret;
                mrentaquinta.sueldo = Convert.ToDecimal(Sueldo);
                mrentaquinta.Grati = Convert.ToDecimal(Gratificacion);
               
                TryUpdateModel(mrentaquinta);
                entidades.SaveChanges();
                entidades.RCALCULORETENCION(mrentaquinta.IdPersonal);
                return Content("OK");
            }
            catch
            {
                return Content("ERROR");
            }
        }
        //
        // GET: /rentaquinta/Delete/5
 
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /rentaquinta/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }


        public ActionResult reporte(int id, int id1)
        {
            string strResponse = String.Empty;
            try
            {
                LocalReport localReport = new LocalReport();
                localReport.ReportPath = Server.MapPath("~/Content/Reportes/RCERTRENTAQUINTA.rdlc");
                System.Data.Objects.ObjectResult<FONCREAGROINTEGRAL.Models.PARepCertRentaQuintaAnual_Result> data = entidades.PARepCertRentaQuintaAnual(id1, id/*id*/);

                ReportDataSource reportDataSource = new ReportDataSource("PARepCertRentaQuintaAnual", data);
            
                localReport.DataSources.Add(reportDataSource);
                string reportType = "PDF";
                string mimeType;
                string encoding;
                string fileNameExtension;
                string deviceInfo =
                 "<DeviceInfo>" +
              "  <OutputFormat>PDF</OutputFormat>" +
              //"  <PageWidth>11.69in</PageWidth>" +
              //"  <PageHeight>8.27in</PageHeight>" +
              //"  <MarginTop>0in</MarginTop>" +
              //"  <MarginLeft>0in</MarginLeft>" +
              //"  <MarginRight>0in</MarginRight>" +
              //"  <MarginBottom>0in</MarginBottom>" +
              "</DeviceInfo>";
                Warning[] warnings;
                string[] streams;
                byte[] renderedBytes;
                renderedBytes = localReport.Render(
                    reportType,
                    deviceInfo,
                    out mimeType,
                    out encoding,
                    out fileNameExtension,
                    out streams,
                    out warnings);
                Response.Clear();
                Response.ContentType = mimeType;
                Response.AddHeader("content-disposition", "attachment; filename=Reporte_CertificadoQuinta." + fileNameExtension);
                Response.BinaryWrite(renderedBytes);
                Response.End();
                return File(renderedBytes, mimeType);
                
            }
            catch
            {
                return  Content("0");


            }
        }

    }
}
